home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PROG_TOO / C023A.ZIP / PART2 / ZOPT2.C < prev    next >
Text File  |  1990-01-31  |  7KB  |  296 lines

  1. /*
  2.  * zopt - five pass optimiser for small-C  (second pass)
  3.  *        v2.0 - uses independent processes
  4.  *
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "zopt.h"
  10.  
  11. char *ln1, *ln2, *ln3, *ln4, *ln5, *ln6 ;
  12.  
  13. pass2()
  14. {
  15.     int saved[12] ;
  16.     int i ;
  17.     char line[LINELEN] ;
  18.     char *tail, *arg, *temp, *temp2, *temp3 ;
  19.  
  20.     /* start pass 3 */
  21.     switch_down(1) ;
  22.  
  23.     saved[0] = saved[1] = saved[2] = saved[3] = 0 ;
  24.     saved[4] = saved[5] = saved[6] = saved[7] = saved[8] = 0 ;
  25.     saved[9] = saved[10] = saved[11] = 0 ;
  26.  
  27.     ln1 = alloc(LINELEN) ;
  28.     ln2 = alloc(LINELEN) ;
  29.     ln3 = alloc(LINELEN) ;
  30.     ln4 = alloc(LINELEN) ;
  31.     ln5 = alloc(LINELEN) ;
  32.     ln6 = alloc(LINELEN) ;
  33.  
  34.     p_read(ln1) ;
  35.     p_read(ln2) ;
  36.     p_read(ln3) ;
  37.     p_read(ln4) ;
  38.     p_read(ln5) ;
  39.  
  40.     while ( p_read(ln6) ) {
  41.  
  42.         /* inc or dec top or second on stack */
  43.         if ( strcmp(Ldhl0,ln1) == 0 ||
  44.              strcmp(Ldhl2,ln1) == 0 ||
  45.              strcmp(Ldhl4,ln1) == 0 ||
  46.              strcmp(Ldhl6,ln1) == 0 ) {
  47.  
  48.             if ( strcmp("\tADD HL,SP",ln2) == 0 &&
  49.                  strcmp(Pushhl,ln3) == 0 &&
  50.                  strcmp("\tCALL ccgint",ln4) == 0 &&
  51.                  (strcmp(Inchl,ln5) == 0 || strcmp(Dechl,ln5) == 0) &&
  52.                  strcmp("\tCALL ccpint",ln6) == 0 ) {
  53.  
  54.                 if ( strcmp(Ldhl6,ln1) == 0 ) {
  55.                     c_write(Popix);
  56.                     c_write(Popde);
  57.                     c_write(Popbc);
  58.                 }
  59.                 else if ( strcmp(Ldhl4,ln1) == 0 ) {
  60.                     c_write(Popde);
  61.                     c_write(Popbc);
  62.                 }
  63.                 else if ( strcmp(Ldhl2,ln1) == 0 ) {
  64.                     c_write(Popbc);
  65.                 }
  66.                 c_write(Pophl);
  67.                 c_write(ln5);
  68.                 if ( strcmp(Ldhl6,ln1) == 0 ) {
  69.                     c_write(Pushhl);
  70.                     c_write(Pushbc);
  71.                     c_write(Pushde);
  72.                     strcpy(ln1,Pushix);
  73.                     ++saved[3];
  74.                 }
  75.                 else if ( strcmp(Ldhl4,ln1) == 0 ) {
  76.                     c_write(Pushhl);
  77.                     c_write(Pushbc);
  78.                     strcpy(ln1,Pushde);
  79.                     ++saved[2];
  80.                 }
  81.                 else if ( strcmp(Ldhl2,ln1) == 0 ) {
  82.                     c_write(Pushhl);
  83.                     strcpy(ln1,Pushbc);
  84.                     ++saved[1];
  85.                 }
  86.                 else {
  87.                     strcpy(ln1,Pushhl);
  88.                     ++saved[0] ;
  89.                 }
  90.                 p_read(ln2);
  91.                 p_read(ln3);
  92.                 p_read(ln4);
  93.                 p_read(ln5);
  94.                 p_read(ln6);
  95.             }
  96.         }
  97.  
  98.         /* check for comparison against small constant and jump */
  99.         if ( strcmp(Exdehl, ln1) == 0 &&
  100.              (arg=match(Ldhl, ln2)) && 
  101.             (strcmp("\tCALL cceq",ln3) == 0 || strcmp("\tCALL ccne",ln3) == 0) )
  102.  
  103.           if ( strcmp("\tLD A,H", ln4) == 0 &&
  104.              strcmp("\tOR L", ln5) == 0 &&
  105.             ((tail=match("\tJP NZ,",ln6)) || (tail=match("\tJP Z,",ln6)))) {
  106.  
  107.               if ( (i=chk_arg(arg)) != 0 ) {
  108.                 if ( strcmp("\tCALL cceq",ln3) == 0 ) {
  109.                     if ( match("\tJP NZ,",ln6 ) ) {
  110.                         strcpy(line, "\tJP Z,") ;
  111.                     }
  112.                     else {
  113.                         strcpy(line, "\tJP NZ,") ;
  114.                     }
  115.                     strcat(line, tail) ;
  116.                     strcpy(ln6, line) ;
  117.                 }
  118.                 temp = ln1 ;
  119.                 temp2 = ln2 ;
  120.                 temp3 = ln3 ;
  121.                 ln1 = ln4 ;
  122.                 ln2 = ln5 ;
  123.                 ln3 = ln6 ;
  124.                 ln4 = temp ;
  125.                 ln5 = temp2 ;
  126.                 ln6 = temp3 ;
  127.                 p_read(ln4) ;
  128.                 p_read(ln5) ;
  129.                 p_read(ln6) ;
  130.                 ++saved[3+i] ;
  131.             }
  132.         }
  133.  
  134.         /* lh hl,0 after test has ensured hl is zero */
  135.         if ( strcmp("\tLD A,H", ln1) == 0 ) {
  136.           if ( strcmp("\tOR L", ln2) == 0 ) {
  137.             if ( match("\tJP NZ,", ln3) ) {
  138.               if ( strcmp(Ldhl0, ln4) == 0 ) {
  139.                 temp = ln4 ;
  140.                 ln4 = ln5 ;
  141.                 ln5 = ln6 ;
  142.                 ln6 = temp ;
  143.                 p_read(ln6) ;
  144.                 ++saved[9] ;
  145.               }
  146.             }
  147.           }
  148.         }
  149.  
  150.         /* return TOS, one item on stack */
  151.         if ( strcmp(Pophl, ln3) == 0 ) {
  152.           if ( strcmp(Pushhl, ln4) == 0 ) {
  153.             if ( strcmp(Popbc, ln5) == 0 ) {
  154.               if ( strcmp(Ret, ln6) == 0 ) {
  155.                 strcpy(ln4, Ret) ;
  156.                 p_read(ln5) ;
  157.                 p_read(ln6) ;
  158.                 ++saved[10] ;
  159.               }
  160.             }
  161.           }
  162.         }
  163.  
  164.         /* return TOS, two items on stack */
  165.         if ( strcmp(Pophl, ln2) == 0 ) {
  166.           if ( strcmp(Pushhl, ln3) == 0 ) {
  167.             if ( strcmp(Popbc, ln4) == 0 ) {
  168.               if ( strcmp(Popbc, ln5) == 0 ) {
  169.                 if ( strcmp(Ret, ln6) == 0 ) {
  170.                   strcpy(ln3, Popbc) ;
  171.                   strcpy(ln4, Ret) ;
  172.                   p_read(ln5) ;
  173.                   p_read(ln6) ;
  174.                   ++saved[11] ;
  175.                 }
  176.               }
  177.             }
  178.           }
  179.         }
  180.  
  181.         c_write(ln1);    
  182.         temp = ln1;
  183.         ln1 = ln2;
  184.         ln2 = ln3;
  185.         ln3 = ln4;
  186.         ln4 = ln5;
  187.         ln5 = ln6;
  188.         ln6 = temp;
  189.         if (cpm(CONIN, 255) == CTRLC) exit() ;
  190.     }
  191.     c_write(ln1);
  192.     c_write(ln2);
  193.     c_write(ln3);
  194.     c_write(ln4);
  195.     c_write(ln5);
  196.  
  197.     puts("INC or DEC top of stack       "); putdec(saved[0]) ;
  198.     putchar('\n') ;
  199.     puts("INC or DEC 2nd top of stack   "); putdec(saved[1]) ;
  200.     putchar('\n') ;
  201.     puts("INC or DEC 3rd top of stack   "); putdec(saved[2]) ;
  202.     putchar('\n') ;
  203.     puts("INC or DEC 4th top of stack   "); putdec(saved[3]) ;
  204.     putchar('\n') ;
  205.     puts("Test for == or != zero        "); putdec(saved[4]) ;
  206.     putchar('\n') ;
  207.     puts("Test for == or != +/-1        "); putdec(saved[5]) ;
  208.     putchar('\n') ;
  209.     puts("Test for == or != +/-2        "); putdec(saved[6]) ;
  210.     putchar('\n') ;
  211.     puts("Test for == or != +/-3        "); putdec(saved[7]) ;
  212.     putchar('\n') ;
  213.     puts("Test for == or != constant    "); putdec(saved[8]) ;
  214.     putchar('\n') ;
  215.     puts("LD HL,0 when HL is zero       "); putdec(saved[9]) ;
  216.     putchar('\n') ;
  217.     puts("Return TOS, one item on stack "); putdec(saved[10]) ;
  218.     putchar('\n') ;
  219.     puts("Return TOS, two on stack      "); putdec(saved[11]) ;
  220.     putchar('\n') ;
  221.     putchar('\n') ;
  222.     i = saved[0]*9 + saved[1]*7  + saved[2]*5 + saved[3] ;
  223.     i += saved[4]*7 + saved[5]*6 + saved[6]*5 + saved[7]*4 ;
  224.     i += saved[8]*3 + saved[9]*3 + saved[10]*2 + saved[11]*2 ;
  225.     pr_total(i);
  226.  
  227.     Total += i ;
  228. }
  229.  
  230. /*
  231.  * check that argument of LD HL is a constant
  232.  * if it is, subtract it from contents of primary register
  233.  * return 1 if integer was 0
  234.  *        2                1
  235.  *        3                2
  236.  *        4                3
  237.  *        5                anything else
  238.  */
  239. chk_arg(arg)
  240. char *arg ;
  241. {
  242.     char temp[80], *sign ;
  243.     int i ;
  244.  
  245.     i = 0 ;
  246.     if ( arg[1] == 0 ) {
  247.         switch ( arg[0] ) {
  248.         case '3' :
  249.             ++i ;
  250.             c_write(Dechl) ;
  251.         case '2' :
  252.             ++i ;
  253.             c_write(Dechl) ;
  254.         case '1' :
  255.             ++i ;
  256.             c_write(Dechl) ;
  257.         case '0' :
  258.             ++i ;
  259.             return i ;
  260.         }
  261.     }
  262.     else if ( arg[0] == '-' && arg[2] == 0 ) {
  263.         switch ( arg[1] ) {
  264.         case '3' :
  265.             ++i ;
  266.             c_write(Inchl) ;
  267.         case '2' :
  268.             ++i ;
  269.             c_write(Inchl) ;
  270.         case '1' :
  271.             i += 2;
  272.             c_write(Inchl) ;
  273.             return i ;
  274.         }
  275.     }
  276.  
  277.     /* not a *very* small integer, is it an integer at all? */
  278.  
  279.     /* prepare to change sign of argument */
  280.     sign = "-" ;
  281.     if ( arg[0] == '-' ) {
  282.         /* negative number changed to positive */
  283.         sign = "" ;
  284.         ++arg ;
  285.     }
  286.     if ( allnum(arg) ) {
  287.         strcpy(temp, Ldde) ;
  288.         strcat(temp, sign) ;
  289.         strcat(temp, arg) ;
  290.         c_write(temp) ;
  291.         c_write(Addhlde) ;
  292.         return 5 ;
  293.     }
  294.     return 0 ;
  295. }
  296.